home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / comms / other / ctcpmaster / ctcp-master.amirx < prev    next >
Text File  |  1999-12-06  |  71KB  |  1,615 lines

  1. /* CTCP Master v1.10
  2.  *
  3.  * Monitors AmIRC incoming messages and acts on CTCP messages and DCC
  4.  * requests.  Supports custom commands on channel or by /MSG.
  5.  *
  6.  */
  7.  
  8. Options Results
  9. Signal On Error
  10. Signal On Syntax
  11. Signal On Halt
  12.  
  13. If ~show(L,"rexxsupport.library") then Do
  14.   If ~addlib("rexxsupport.library",0,-30,0) then Do
  15.     'Echo Could not access the rexxsupport.library!'
  16.     Exit 20
  17.   End
  18. End
  19. If ~show(L,"rexxreqtools.library") then Do
  20.   If ~addlib("rexxreqtools.library",0,-30,0) then Do
  21.     'Echo Could not access the rexxreqtools.library!'
  22.     Exit 20
  23.   End
  24. End
  25. If ~show(L,"rexxarplib.library") then Do
  26.   If ~addlib("rexxarplib.library",0,-30,0) then Do
  27.     'Echo Could not access the rexxarplib.library!'
  28.     Exit 20
  29.   End
  30. End
  31.  
  32. Address Value Address()
  33. PortNumber = Right(Address(),2)
  34. If Show("P","CTCP-MASTER"||PortNumber) = 1 then Exit
  35. 'ECHO P='d2c(27)'b«CTCPMaster» Starting...'
  36. MyPort = OpenPort("CTCP-MASTER"||PortNumber)
  37.  
  38. If Exists("AmIRC:Rexx/CTCP-Master.CFG") then Do
  39.   Call Open(In,"AmIRC:Rexx/CTCP-Master.CFG","R")
  40.   Do Until EOF(In)
  41.     CfgLine = ReadLn(In)
  42.     Interpret CfgLine
  43.   End
  44.   Call Close(In)
  45. End
  46. Else Do
  47.   'Echo P='d2c(27)'b«CTCPMaster» Unable to load config file'
  48.   Signal Error
  49. End
  50.  
  51. LastHost. = "unknown@some.domain"
  52. LastReason. = "Leaving IRC"
  53.  
  54. Call ReadOPs
  55.  
  56. NumFAQ = 0
  57. If Exists("AmIRC:Rexx/CTCP-FAQ") then Do
  58.   Call Open("FAQ","AmIRC:Rexx/CTCP-FAQ","R")
  59.     Do Until EOF("FAQ")
  60.       NumFAQ = NumFAQ + 1
  61.       FAQName.NumFAQ = ReadLn("FAQ")
  62.       FAQText.NumFAQ = ReadLn("FAQ")
  63.     End
  64.   Call Close("FAQ")
  65.   NumFAQ = NumFAQ - 1
  66.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumFAQ' FAQs...'
  67. End
  68.  
  69. NumQuits = 0
  70. If Exists("AmIRC:Rexx/CTCP-QuitMsgs") then Do
  71.   Call Open("QM","AmIRC:Rexx/CTCP-QuitMsgs","R")
  72.     Do Until EOF("QM")
  73.       NumQuits = NumQuits + 1
  74.       QuitText.NumQuits = ReadLn("QM")
  75.     End
  76.   Call Close("QM")
  77.   NumQuits = NumQuits - 1
  78.   If NumQuits = 0 then Do
  79.     NumQuits = 1
  80.     QuitText.1 = "Bye!"
  81.   End
  82.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumQuits' Quit Messages...'
  83. End
  84.  
  85. NumPings = 0
  86. If Exists("AmIRC:Rexx/CTCP-Pings") then Do
  87.   Call Open("Ping","AmIRC:Rexx/CTCP-Pings","R")
  88.     Do Until EOF("Ping")
  89.       NumPings = NumPings + 1
  90.       PingPhrase.NumPings = ReadLn("Ping")
  91.     End
  92.   Call Close("Ping")
  93.   NumPings = NumPings - 1
  94.   If NumPings = 0 then Do
  95.     NumPings = 1
  96.     PingPhrase.1 = "PONG!"
  97.   End
  98.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumPings' PING Responses...'
  99.   NextPing = 1
  100. End
  101.  
  102. NumUsers = 0
  103. GetServerName ; Server = Result
  104. Server = Translate(Server,' ','.')
  105. Server = SubWord(Server,Words(Server)-1)
  106. Server = Translate(Server,'.',' ')
  107. 'ECHO P='d2c(27)'b«CTCPMaster» Connected on server 'Server', now looking for QuitLog.'
  108. If Exists("AmIRC:Rexx/CTCP-QuitLog."||Server) then Do
  109.   NumUsers = 1
  110.   Call Open("QuitLog","AmIRC:Rexx/CTCP-QuitLog."||Server,"R")
  111.     Do Until EOF("QuitLog")
  112.       Line = ReadLn("QuitLog")
  113.       If Length(Line) = 0 then Leave
  114.       UserNick.NumUsers.0 = Word(Line,1)
  115.       Temp = UserNick.NumUsers.0
  116.       Do ILoop = 1 to Temp
  117.         UserNick.NumUsers.ILoop = Word(Line,ILoop+1)
  118.       End
  119.       UserChan.NumUsers = Word(Line,Temp + 2)
  120.       UserQuit.NumUsers = Word(Line,Temp + 3)||" "||Word(Line,Temp + 4)
  121.       If Words(Line) > Temp + 4 then Do
  122.         LastHost.NumUsers = Word(Line,Temp + 5)
  123.         LastReason.NumUsers = SubWord(Line,Temp + 6)
  124.       End
  125.       NumUsers = NumUsers + 1
  126.     End
  127.   Call Close("QuitLog")
  128.   NumUsers = NumUsers - 1
  129.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumUsers' Users...'
  130. End
  131. Call RateList
  132.  
  133. LastLine = ""
  134. CRNL = "0d0a"x
  135.  
  136. MainLoop:
  137. GetMyNick ; MyNick = Result
  138. GetLine
  139. If Line = LastLine then Signal MainLoop
  140. NickAddress = Word(Line,1)
  141. Parse Var NickAddress ':'Nick'!'HA
  142. LastHost.0 = HA
  143. HA = Upper(HA)
  144. Type = Upper(Word(Line,2))
  145. ToWho = Word(Line,3)
  146. Rest = Subword(Line,4)
  147. Parse Var Rest ':'Rest
  148. If (Type = "JOIN") & (NumOps > 0) & (Upper(Nick) ~= Upper(MyNick)) then Do
  149.   GetUsers
  150.   ThePeeps = Result
  151.   HaveOPs = 0
  152.   If Find(ThePeeps,'@'MyNick) = 0 then Signal MainLoop
  153.   Rest = Upper(SubStr(ToWho,2))
  154.   Call GetMask
  155.   Do OpLoop = 1 to NumOps
  156.     If (HA = OpHost.OpLoop) & (Rest = Upper(OpChannel.OpLoop)) then Do
  157.       'ECHO P='d2c(27)'b«CTCPMaster» Detected 'Nick' ('HA'), attempting to Auto-OP'
  158.       'SAY /OP 'OpChannel.OpLoop' 'Nick
  159.     End
  160.   End
  161. End
  162. If (Type = "PRIVMSG") & (Upper(Nick) = Upper(MyNick)) & (LastLine ~= "") then Do
  163.   If Upper(Word(Rest,1)) = "#HELP" then Do
  164.     'ECHO P='d2c(27)'b«CTCPMaster» Available Commands...'
  165.     'ECHO P='d2c(27)'b«CTCPMaster» #STOP  #QUIT  #SOUND  #AWAY  #OPS  #SHOWOPS  #FAQKILL  #FAQADD  #FAQREAD'
  166.     'ECHO P='d2c(27)'b«CTCPMaster» /CTCP Commands: PING  SOUND  PAGE  USERINFO'
  167.     'ECHO P='d2c(27)'b«CTCPMaster» 'Trigger' Commands: '||Trigger||'TEACH  '||Trigger||'COUNTRY  '||Trigger||'TIME  '||Trigger||'SEEN  '||Trigger||'FAQADD  '||Trigger||'FAQ  '||Trigger||'CONVERT '||Trigger||'CURRENCY '||Trigger||'EXCHANGE  '||Trigger||'SHOWCOMMANDS  '||Trigger||'HELP  '||Trigger||'FIND  '||Trigger||'TRANSLATE  '||Trigger||'MONTH  '||Trigger||'DNS  '
  168.   End
  169.   If Upper(Word(Rest,1)) = "#STOP" then Do
  170.     'ECHO P='d2c(27)'b«CTCPMaster» Exiting...'
  171.     Call ClosePort("CTCP-MASTER")
  172.     Exit
  173.   End
  174.   If Upper(Word(Rest,1)) = "#QUIT" then Do
  175.     PickQuit = Random(1,NumQuits,Time(S))
  176.     'SAY /QUIT 'QuitText.PickQuit
  177.     Call ClosePort("CTCP-MASTER")
  178.     Exit
  179.   End
  180.   If Upper(Word(Rest,1)) = "#SOUND" then Do
  181.     GetChannel ; ToWhom = Result
  182.     ToWhom = RtGetString(ToWhom,"   CTCP Sound UserName   ","CTCP-Master.Amirx © 1997 Digital Euphoria","_OK|_Cancel","rt_pubscrname='"PubScreen"'",Option)
  183.     If Option = 0 then Signal MainLoop
  184.     SoundFile = RtFilerequest(SoundDir, SoundFile,"CTCP-Master.Amirx © 1997 Digital Euphoria","_Send|_Cancel","rt_pubscrname='"PubScreen"'",Option)
  185.     SoundFile = Translate(Soundfile,"  ",":/")
  186.     SoundFile = Word(SoundFile,Words(SoundFile))
  187.     If Option = 0 then Signal MainLoop
  188.     If Option = 1 then 'Say /CTCP 'ToWhom' Sound 'SoundFile
  189.   End
  190.   If Upper(Word(Rest,1)) = "#AWAY" then Do
  191.     If Exists("Env:Away") then Do
  192.       Call Delete("Env:Away")
  193.       'SAY /ME is back.'
  194.     End
  195.     Else Do
  196.       Reason = SubWord(Rest,2)
  197.       Call Open(Away,"Env:Away","W")
  198.         Call WriteLn(Away,Reason)
  199.       Call Close(Away)
  200.       'SAY /ME is 'd2c(2)'AWAY'd2c(2)' - 'Reason' - /CTCP 'MyNick' PAGE {reason}'
  201.     End
  202.   End
  203.   If Upper(Word(Rest,1)) = "#OPS" then Do
  204.     If Words(Rest) = 3 then Do
  205.       FountIt = 0
  206.       Nickname = Word(Rest,2)
  207.       Chan = Word(Rest,3)
  208.       GetUsers ; UserList = Compress(Result,"@+")
  209.       Do ULoop = 1 to Words(UserList)
  210.         If Upper(NickName) = Upper(Word(UserList,ULoop)) then Do
  211.           NickName = Word(UserList,ULoop)
  212.           FoundIt = 1
  213.         End
  214.       End
  215.       If FoundIt = 1 then Do
  216.         UserHost Nickname ; HA = Result
  217.         Call GetMask
  218.         NumOps = NumOps + 1
  219.         OpHost.NumOps = HA
  220.         OpChannel.NumOps = Chan
  221.         OpNick.NumOps = NickName
  222.         Call WriteOps
  223.         'ECHO P='d2c(27)'b«CTCPMaster» Added 'OpNick.NumOps' ('OpHost.NumOps') to Auto-OP List...'
  224.       End
  225.     End
  226.     Else If Words(Rest) = 4 then Do
  227.       Kill = Word(Rest,2)
  228.       If Kill ~= "-" then Signal MainLoop
  229.       Nickname = Word(Rest,3)
  230.       Chan = Word(Rest,4)
  231.       Remove = 0
  232.       Do Loop = 1 to NumOps
  233.         If (Upper(Nickname) = Upper(OpNick.Loop)) & (Upper(Chan) = Upper(OpChannel.Loop)) then Remove = Loop
  234.       End
  235.       If Remove > 0 then Do
  236.         Do Loop = Remove to (NumOps - 1)
  237.           X = Loop + 1
  238.           OpHost.Loop = OpHost.X
  239.           OpChannel.NumOps = OpChannel.X
  240.           OpNick.NumOps = OpNick.X
  241.         End
  242.         NumOps = NumOps - 1
  243.         Call WriteOps
  244.         'ECHO P='d2c(27)'b«CTCPMaster» Removed 'Nickname' from Auto-OP List...'
  245.       End
  246.     End
  247.     Else Call ReadOPs
  248.   End
  249.   If Upper(Word(Rest,1)) = "#SHOWOPS" then Do
  250.     Do Loop = 1 to NumOps
  251.       'ECHO P='d2c(27)'b«CTCPMaster» Monitoring 'OpNick.Loop' ('OpHost.Loop') on Channel 'OpChannel.Loop'...'
  252.     End
  253.   End
  254.   If (Upper(Word(Rest,1)) = "#FAQKILL") & (NumFAQ > 0) then Do
  255.     FAQFound = 0 ; DelFAQ = 0
  256.     Do FAQLoop = 1 to NumFAQ
  257.       If Upper(Word(Rest,2)) = FAQName.FAQLoop then Do
  258.         FAQFound = 1
  259.         DelFAQ = FAQLoop
  260.       End
  261.     End
  262.     Do FAQLoop = DelFAQ to NumFAQ - 1
  263.       OldFAQ = FAQLoop + 1
  264.       FAQName.FAQLoop = FAQName.OldFAQ
  265.       FAQText.FAQLoop = FAQText.OldFAQ
  266.     End
  267.     NumFAQ = NumFAQ - 1
  268.     Call Open(FAQ,"AmIRC:Rexx/CTCP-FAQ","W")
  269.       Do FAQLoop = 1 to NumFAQ
  270.         Call WriteLn("FAQ",FAQName.FAQLoop)
  271.         Call WriteLn("FAQ",FAQText.FAQLoop)
  272.       End
  273.       'ECHO P='d2c(27)'b«CTCPMaster» FAQ 'd2c(2)||Upper(Word(Rest,2))||d2c(2)' has been removed from the database.'
  274.     Call Close("FAQ")
  275.   End
  276.   If Upper(Word(Rest,1)) = "#FAQADD" then Do
  277.     FAQFound = 0
  278.     If NumFAQ > 0 then Do
  279.       Do FAQLoop = 1 to NumFAQ
  280.         If Upper(Word(Rest,2)) = FAQName.FAQLoop then Do
  281.           FAQText.FAQLoop = SubWord(Rest,3)
  282.           FAQFound = 1
  283.         End
  284.       End
  285.     End
  286.     If FAQFound = 0 then Do
  287.       NumFAQ = NumFAQ + 1
  288.       FAQName.NumFAQ = Upper(Word(Rest,2))
  289.       FAQText.NumFAQ = SubWord(Rest,3)
  290.     End
  291.     Call Open(FAQ,"AmIRC:Rexx/CTCP-FAQ","W")
  292.       Do FAQLoop = 1 to NumFAQ
  293.         Call WriteLn("FAQ",FAQName.FAQLoop)
  294.         Call WriteLn("FAQ",FAQText.FAQLoop)
  295.       End
  296.       'ECHO P='d2c(27)'b«CTCPMaster» FAQ 'd2c(2)||Upper(Word(Rest,2))||d2c(2)' has been added to the database.'
  297.     Call Close("FAQ")
  298.   End
  299.   If Upper(Word(Rest,1)) = "#FAQREAD" then Do
  300.     NumFAQ = 0
  301.     If Exists("AmIRC:Rexx/CTCP-FAQ") then Do
  302.       Call Open("FAQ","AmIRC:Rexx/CTCP-FAQ","R")
  303.         Do Until EOF("FAQ")
  304.           NumFAQ = NumFAQ + 1
  305.           FAQName.NumFAQ = ReadLn("FAQ")
  306.           FAQText.NumFAQ = ReadLn("FAQ")
  307.         End
  308.       Call Close("FAQ")
  309.       NumFAQ = NumFAQ - 1
  310.       'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumFAQ' FAQs...'
  311.     End
  312.   End
  313. End
  314. If (Type = "QUIT") | (Type = "PART") then Do
  315.   If Type = "PART" then Channel = ToWho
  316.   Else Channel = "IRC"
  317.   HA = LastHost.0 ; Call GetMask
  318.   Found = 0
  319.   If NumUsers > 0 then Do QuitLoop = 1 to NumUsers
  320.     If Upper(HA) = Upper(LastHost.QuitLoop) then Do
  321.       Found = 1
  322.       NFound = 0
  323.       Do ILoop = 1 to UserNick.QuitLoop.0
  324.         If Upper(UserNick.QuitLoop.ILoop) = Upper(Nick) then NFound = 1
  325.       End
  326.       If NFound = 0 then Do
  327.         UserNick.QuitLoop.0 = UserNick.QuitLoop.0 + 1
  328.         Blah = UserNick.QuitLoop.0
  329.         UserNick.QuitLoop.Blah = Nick
  330.       End
  331.       LastReason.QuitLoop = Strip(SubWord(Line,3),"L",":")
  332.       If (Words(LastReason.QuitLoop) = 2) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) then LastReason.QuitLoop = "NetSplit!"
  333.       If Type = "PART" then LastReason.QuitLoop = "Left the channel."
  334.       TempTime = Time("M")
  335.       TempDate = Date("I")
  336.       UserQuit.QuitLoop = TempTime||" "||TempDate
  337.       UserChan.QuitLoop = Channel
  338.       Leave QuitLoop
  339.     End
  340.     If Found = 0 then Do
  341.       Do NLoop = 1 to UserNick.QuitLoop.0
  342.         If Upper(Nick) = Upper(UserNick.QuitLoop.NLoop) then Do
  343.           Found = 1
  344.           LastReason.QuitLoop = Strip(SubWord(Line,3),"L",":")
  345.           If (Words(LastReason.QuitLoop) = 2) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) then LastReason.QuitLoop = "NetSplit!"
  346.           If Type = "PART" then LastReason.QuitLoop = "Left the channel."
  347.           TempTime = Time("M")
  348.           TempDate = Date("I")
  349.           LastHost.QuitLoop = HA
  350.           UserQuit.QuitLoop = TempTime||" "||TempDate
  351.           UserChan.QuitLoop = Channel
  352.           Leave QuitLoop
  353.         End
  354.       End
  355.     End
  356.   End
  357.   If Found = 0 then Do
  358.     NumUsers = NumUsers + 1
  359.     UserNick.NumUsers.0 = 1
  360.     UserNick.NumUsers.1 = Nick
  361.     LastHost.NumUsers = HA
  362.     LastReason.NumUsers = Strip(SubWord(Line,3),"L",":")
  363.     If (Words(LastReason.NumUsers) = 2) & (Pos(".",Word(LastReason.NumUsers,1)) > 0) & (Pos(".",Word(LastReason.NumUsers,1)) > 0) then LastReason.NumUsers = "NetSplit!"
  364.     If Type = "PART" then LastReason.NumUsers = "Left the channel."
  365.     UserChan.NumUsers = Channel
  366.     TempTime = Time("M")
  367.     TempDate = Date("I")
  368.     UserQuit.NumUsers = TempTime||" "||TempDate
  369.   End
  370.   Call Open("QuitLog","AmIRC:Rexx/CTCP-QuitLog."||Server,"W")
  371.     Do QuitLoop = 1 to NumUsers
  372.       Call WriteCh("QuitLog",UserNick.QuitLoop.0||" ")
  373.       Do ILoop = 1 to UserNick.QuitLoop.0
  374.         Call WriteCh("QuitLog",UserNick.QuitLoop.ILoop||" ")
  375.       End
  376.       Call WriteLn("QuitLog",UserChan.QuitLoop||" "||UserQuit.QuitLoop||" "||LastHost.QuitLoop||" "||LastReason.QuitLoop)
  377.     End
  378.   Call Close("QuitLog")
  379. End
  380. If (Type = "PRIVMSG") & (Left(Rest,1) = D2C(1)) & (Right(Rest,1) = D2C(1)) then Do
  381.   Rest = SubStr(Rest,2,Length(Rest)-2)
  382.   If Upper(Word(Rest,1)) = "PING" then Do
  383.     'RAW NOTICE 'NICK' :'PingPhrase.NextPing
  384.     NextPing = NextPing + 1
  385.     If NextPing > NumPings then NextPing = 1
  386.   End
  387.   If Upper(Word(Rest,1)) = "SOUND" then Do
  388.     SoundToPlay = Word(Rest,2)
  389.     If ~Exists(SoundDir||SoundToPlay) then 'SAY /MSG '||NICK||' !'||NICK||' '||SoundToPlay
  390.   End
  391.   If Upper(Word(Rest,1)) = "GETSOUND" then Do
  392.     FileToSend = Word(Rest,2)
  393.     If Exists(SoundDir||FileToSend) then "Say /DCC SEND "Nick" "SoundDir||FileToSend
  394.     Else "Raw Notice "Nick" :Sorry, couldn't find the sound file -> "FileToSend
  395.   End
  396.   If Upper(Word(Rest,1)) = "PAGE" then Do
  397.     Reason = SubWord(Rest,2)
  398.     'ECHO P='d2c(27)'b«CTCPMaster» 'd2c(2)'Paged'd2c(2)' by 'NICK'...'d2c(2)'Reason: 'd2c(2)||Reason
  399.     Address Command PageCmd
  400.   End
  401.   If Upper(Word(Rest,1)) = "USERINFO" | Upper(Word(Rest,1)) = "FINGER" then Do
  402.     'Raw Notice 'Nick' :'d2c(3)'5System:'d2c(3)||'4 '||SysDesc
  403.     'Raw Notice 'Nick' :'d2c(3)'5Location:'d2c(3)||'4 '||Location
  404.     'Raw Notice 'Nick' :'d2c(3)'5EMail:'d2c(3)||'4 '||EMail
  405.     'Raw Notice 'Nick' :'d2c(3)'5HomePage:'d2c(3)||'4 '||HomePage
  406.     'Raw Notice 'Nick' :'d2c(3)'5Comment:'d2c(3)||'4 '||Comment
  407.     'Raw Notice 'Nick' :'d2c(3)'4This reply brought to you by CTCP-Master.AMIRX v1.10'
  408.   End
  409. End
  410. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||Upper(MyNick)) then Do
  411.   FileToSend = Word(Rest,2)
  412.   If Upper(Right(FileToSend,4)) = ".MP3" then Do
  413.     If Exists(MP3Dir||FileToSend) then "Say /DCC SEND "Nick" "MP3Dir||FileToSend
  414.     Else "Raw Notice "Nick" :Sorry, couldn't find the MP3 file -> "FileToSend
  415.   End
  416.   If Upper(Right(FileToSend,4)) = ".WAV" then Do
  417.     If Exists(SoundDir||FileToSend) then "Say /DCC SEND "Nick" "SoundDir||FileToSend
  418.     Else "Raw Notice "Nick" :Sorry, couldn't find the sound file -> "FileToSend
  419.   End
  420. End
  421. If (Type = "PRIVMSG") & ((Upper(Word(Rest,1)) = Trigger||"COUNTRY") | (Upper(Word(Rest,1)) = Trigger||"WHERE")) then Do
  422.   FindIt = SubWord(Rest,2)
  423.   If ~Exists("AmIRC:Rexx/Country-Codes.TXT") Then Do
  424.     'Echo P='d2c(27)'b«CTCPMaster» Unable to find AmIRC:Rexx/Country-Codes.TXT'
  425.     Signal MainLoop
  426.   End
  427.   Call Open(Listing,"Amirc:Rexx/Country-Codes.TXT","R")
  428.     FoundIt = FindIt||" was not found in the Database!"
  429.     Do Until EOF(Listing)
  430.       Line = ReadLn(Listing)
  431.       If Upper(Word(Line,1)) = Upper(FindIt) then FoundIt = Upper(FindIt)||" is "SubWord(Line,2)
  432.       If Upper(SubWord(Line,2)) = Upper(FindIt) then FoundIt = "Apparently, "SubWord(Line,2)" is "Upper(Word(Line,1))
  433.     End
  434.   Call Close(Listing)
  435.   If Upper(ToWho) = Upper(MyNick) then Do
  436.     'Raw Notice 'Nick' :'FoundIt
  437.   End
  438.   Else Do
  439.     'Say /Notice 'ToWho' 'Nick': 'FoundIt
  440.   End
  441. End
  442. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"SHOWCOMMANDS") | (Upper(Word(Rest,1)) = Trigger||"HELP") then Do
  443.   'Raw Notice 'Nick' :Available Commands...'
  444.   'Raw Notice 'Nick' :/CTCP Commands: PING  SOUND  PAGE  USERINFO'
  445.   'Raw Notice 'Nick' :'||Trigger||' Commands: '||Trigger||'TEACH  '||Trigger||'COUNTRY  '||Trigger||'TIME  '||Trigger||'SEEN  '||Trigger||'FAQADD  '||Trigger||'FAQ  '||Trigger||'CONVERT  '||Trigger||'CURRENCY  '||Trigger||'EXCHANGE  '||Trigger||'SHOWCOMMANDS  '||Trigger||'HELP  '||Trigger||'FIND  '||Trigger||'TRANSLATE  '||Trigger||'MONTH  '||Trigger||'DNS'
  446. End
  447. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) ="YAWN") then Do
  448.   GetChannel ; Chan = Upper(Result)
  449.   If Chan="#FRISKYS-PLACE" then Do
  450.     'Say /kick #friskys-place 'nick' yawning is not allowed, you''re excused <giggle> Hurry Back!!!'
  451.   End
  452. End
  453. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"TIME") then Do
  454.   DayPlus = 0
  455.   TempTime = Time(H) + GMTOffSet
  456.   If TempTime > 23 then Do
  457.     TempTime = TempTime - 24
  458.     DayPlus = 1
  459.   End
  460.   If TempTime < 0 then Do
  461.     TempTime = TempTime + 24
  462.     DayPlus = -1
  463.   End
  464.   TempTime = Right("0"||TempTime,2)||SubStr(Time(),3)
  465.   TempDate = Translate(Date(N,Date(I)+DayPlus,I),"-"," ")
  466.   If Upper(ToWho) = Upper(MyNick) then Do
  467.     "Raw Notice "Nick" :The current time is "TempTime", "TempDate" GMT."
  468.   End
  469.   Else Do
  470.     "Say /Notice "ToWho" "Nick": The current time is "TempTime", "TempDate" GMT."
  471.   End
  472. End
  473. If (Type = "PRIVMSG") & ((Upper(Word(Rest,1)) = Trigger||"DNS") | (Upper(Word(Rest,1)) = Trigger||"NSLOOKUP")) then Do
  474.   HostToFind = Word(Rest,2)
  475.   If Upper(HostToFind) = "-S" then Do
  476.     HostToFind = SubWord(Rest,2)
  477.   End
  478.   If Pos(".",HostToFind)=0 then Do
  479.     GetUsers ; ThePeeps = Result
  480.     Do XLoop = 1 to Words(ThePeeps)
  481.       If Upper(Word(ThePeeps,XLoop))=Upper(HostToFind) | Upper(Word(ThePeeps,XLoop))=Upper("@"||HostToFind) Then Do
  482.         UserHost HostToFind ; HostToFind = Result
  483.         HostToFind = Word(Translate(HostToFind," ","@"),2)
  484.       End
  485.     End
  486.   End
  487.   Address Command ("Miami:MiamiResolve "||HostToFind||" >Ram:DNS.Result")
  488.   Call Open(In,"Ram:DNS.Result","R")
  489.     DNS1= ReadLn(In)
  490.     If Word(DNS1,1) = "service:" then Do
  491.       DNS2 = ReadLn(In)
  492.       If DNS2 = "aliases:" then Do Forever
  493.         DNS3 = ReadLn(In)
  494.         If Word(DNS3,1) = "port:" then leave
  495.       End
  496.       If Upper(ToWho) = Upper(MyNick) then Do
  497.         "Raw Notice "Nick" :"d2c(2)||DNS1||d2c(2)||" is mapped to "d2c(2)||Strip(DNS3)||d2c(2)
  498.       End
  499.       Else Do
  500.         "Say /Notice "ToWho" "Nick": "||d2c(2)||DNS1||d2c(2)||" is mapped to "d2c(2)||Strip(DNS3)||d2c(2)
  501.       End
  502.     End
  503.     Else If Word(DNS1,1) = "host:" then Do
  504.       DNS2= ReadLn(In)
  505.       DNS3= ReadLn(In)
  506.       If Upper(ToWho) = Upper(MyNick) then Do
  507.         "Raw Notice "Nick" :"DNS1" is "Strip(DNS3)
  508.       End
  509.       Else Do
  510.         "Say /Notice "ToWho" "Nick": "DNS1" is "Strip(DNS3)
  511.       End
  512.     End
  513.     Else Do
  514.       If Upper(ToWho) = Upper(MyNick) then Do
  515.         "Raw Notice "Nick" :"DNS1
  516.       End
  517.       Else Do
  518.         "Say /Notice "ToWho" "Nick": "DNS1
  519.       End
  520.     End
  521.   Call Close(In)
  522. End
  523. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"PHOTO") then Do
  524.   If Exists(Photo) then "Say /DCC SEND "Nick" "Photo
  525. End
  526. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"CALC") then Do
  527.   Expression = "Math = "||SubWord(Rest,2)
  528.   Interpret Expression
  529.   If Upper(ToWho) = Upper(MyNick) then Do
  530.     "Raw Notice "Nick" :Answer is "||d2c(2)||Math||d2c(2)
  531.   End
  532.   Else Do
  533.     "Say /Notice "ToWho" "Nick": Answer is "||d2c(2)||Math||d2c(2)
  534.   End
  535. End
  536. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FAQLIST") & (NumFAQ > 0) then Do
  537.   Response = ""
  538.   Do FAQLoop = 1 to NumFAQ
  539.     Response = Response||FAQName.FAQLoop||", "
  540.   End
  541.   Response = Strip(Response)
  542.   Response = Strip(Response,"T",",")
  543.   If Upper(ToWho) = Upper(MyNick) then Do
  544.     "Raw Notice "Nick" : Available FAQs - "d2c(2)||Response||d2c(2)
  545.   End
  546.   Else Do
  547.     "Say /Notice "ToWho" "Nick": Available FAQs - "d2c(2)||Response||d2c(2)
  548.   End
  549. End
  550. If (Type = "PRIVMSG") & (((Upper(Word(rest,1)) = Trigger||"SEEN") | (Upper(Word(rest,1)) = "SEEN")) & Words(Rest) = 2) then Do
  551.   FindNick = Strip(Word(Rest,2),"T","?")
  552.   Found = 0
  553.   GetChannel ; Channel = Result
  554.   If Upper(ToWho) ~= Upper(MyNick) then Channel = ToWho
  555.   Channels ; Joined = Result
  556.   IsOn = 0
  557.   Do CLoop = 1 to Words(Joined)
  558.     'GetUsers Channel='Word(Joined,CLoop) ; OnChannel = " "||Upper(Compress(Result,"@+"))||" "
  559.     If Pos(Upper(" "||FindNick||" "),OnChannel) > 0 then Do
  560.       IsOn = IsOn + 1
  561.       OnChan.IsOn = Word(Joined,CLoop)
  562.     End
  563.   End
  564.   If IsOn > 0 Then Do
  565.     If Upper(FindNick) = Upper(Nick) then Findnick = "You are"
  566.     Else Findnick = Findnick||" is"
  567.     If IsOn = 1 then ReplyStr = FindNick" on "OnChan.1" right now!"
  568.     If IsOn > 1 then Do
  569.       ReplyStr = FindNick" on "
  570.       Do CLoop = 1 to IsOn - 1
  571.         ReplyStr = ReplyStr||OnChan.CLoop||" "
  572.       End
  573.       ReplyStr = ReplyStr||"and "||OnChan.IsOn||" right now!"
  574.     End
  575.     If Upper(ToWho) = Upper(MyNick) | QuietSeens = 1 then Do
  576.       "Raw Notice "Nick" :"ReplyStr
  577.     End
  578.     Else Do
  579.       "Say /Notice "ToWho" "Nick": "ReplyStr
  580.     End
  581.   End
  582.   If IsOn = 0 then Do
  583.     Do QuitLoop = 1 to NumUsers
  584.       Do ILoop = 1 to UserNick.QuitLoop.0
  585.         If Upper(FindNick) = Upper(UserNick.QuitLoop.ILoop) then Do
  586.           Found = 1
  587.           ReplyText = ""
  588.           TimeThen = Word(UserQuit.QuitLoop,1)
  589.           DateThen = Word(UserQuit.QuitLoop,2)
  590.           TimeNow = Time("M")
  591.           DateNow = Date("I")
  592.           DaysAgo = DateNow - DateThen
  593.           TimePast = ABS(TimeNow - TimeThen)
  594.           TempHour = TimePast % 60
  595.           TempMin = TimePast - (TempHour * 60)
  596.           If DaysAgo = 1 then ReplyText = ReplyText||DaysAgo" day, "
  597.           If DaysAgo > 1 then ReplyText = ReplyText||DaysAgo" days, "
  598.           If TempHour = 1 then ReplyText = ReplyText||TempHour" hour, "
  599.           If TempHour > 1 then ReplyText = ReplyText||TempHour" hours, "
  600.           If TempMin = 1 then ReplyText = ReplyText||TempMin" minute ago."
  601.           Else ReplyText = ReplyText||TempMin" minutes ago."
  602.           If Upper(ToWho) = Upper(MyNick) then Do
  603.             "Raw Notice "Nick" :I last saw "UserNick.QuitLoop.ILoop" ("LastHost.QuitLoop") on "UserChan.QuitLoop" "ReplyText" Reason for leaving: "LastReason.QuitLoop
  604.           End
  605.           Else Do
  606.             "Say /Notice "ToWho" "Nick": I last saw "UserNick.QuitLoop.ILoop" ("LastHost.QuitLoop") on "UserChan.QuitLoop" "ReplyText" Reason for leaving: "LastReason.QuitLoop
  607.           End
  608.           Leave QuitLoop
  609.         End
  610.       End
  611.     End
  612.     If Found = 0 then Do
  613.       If Upper(ToWho) = Upper(MyNick) then Do
  614.         "Raw Notice "Nick" :I have not seen "FindNick" on "Channel" yet."
  615.       End
  616.       Else Do
  617.         "Say /Notice "ToWho" "Nick": I have not seen "FindNick" on "Channel" yet."
  618.       End
  619.     End
  620.   End
  621. End
  622. If (Type = "PRIVMSG") & (Upper(Word(rest,1)) = Trigger||"LAST") then Do
  623.   If Words(rest) > 1 then FindNick = Word(rest,2)
  624.   Else FindNick = Nick
  625.   Found = 0
  626.   GetChannel ; Channel = Result
  627.   If Upper(ToWho) ~= Upper(MyNick) then Channel = ToWho
  628.   Do QuitLoop = 1 to NumUsers
  629.     Do ILoop = 1 to UserNick.QuitLoop.0
  630.       If Upper(FindNick) = Upper(UserNick.QuitLoop.ILoop) then Do
  631.         Found = 1
  632.         ReplyText = "Last quit message for "UserNick.QuitLoop.ILoop" was '"d2c(2)||LastReason.QuitLoop||d2c(2)"'"
  633.         If Upper(ToWho) = Upper(MyNick) then Do
  634.           "Raw Notice "Nick " :"ReplyText
  635.         End
  636.         Else Do
  637.           "Say /Notice "ToWho" "Nick": "ReplyText
  638.         End
  639.       End
  640.     End
  641.   End
  642.   If Found = 0 then Do
  643.     If Upper(ToWho) = Upper(MyNick) then Do
  644.       "Raw Notice "Nick" :I have not seen a /QUIT message from "FindNick" on "Channel" yet."
  645.     End
  646.     Else Do
  647.       "Say /Notice "ToWho" "Nick": I have not seen a /QUIT message from "FindNick" on "Channel" yet."
  648.     End
  649.   End
  650. End
  651. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FAQADD") then Do
  652.   FAQFound = 0
  653.   If NumFAQ > 0 then Do
  654.     Do FAQLoop = 1 to NumFAQ
  655.       If Upper(Word(Rest,2)) = FAQName.FAQLoop then Do
  656.         FAQFound = 1
  657.         If Upper(ToWho) = Upper(MyNick) then Do
  658.           "Raw Notice "Nick" : «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" already exists in the database!"
  659.         End
  660.         Else Do
  661.           "Say /Notice "ToWho" «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" already exists in the database!"
  662.         End
  663.       End
  664.     End
  665.   End
  666.   If FAQFound = 0 then Do
  667.      NumFAQ = NumFAQ + 1
  668.     FAQName.NumFAQ = Upper(Word(Rest,2))
  669.     FAQText.NumFAQ = SubWord(Rest,3)
  670.     Call Open(FAQ,"AmIRC:Rexx/CTCP-FAQ","W")
  671.       Do FAQLoop = 1 to NumFAQ
  672.         Call WriteLn("FAQ",FAQName.FAQLoop)
  673.         Call WriteLn("FAQ",FAQText.FAQLoop)
  674.       End
  675.       If Upper(ToWho) = Upper(MyNick) then Do
  676.         "Raw Notice "Nick" : «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" has been added to the database."
  677.       End
  678.       Else Do
  679.         "Say /Notice "ToWho" «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" has been added to the database."
  680.       End
  681.     Call Close("FAQ")
  682.   End
  683. End
  684. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FAQ") & (NumFAQ > 0) then Do
  685.   FAQFound= 0
  686.   Do FAQLoop = 1 to NumFAQ
  687.     If FAQName.FAQLoop = Upper(Word(Rest,2)) Then Do
  688.       Response = FAQText.FAQLoop
  689.       FAQFound = 1
  690.     End
  691.   End
  692.   If FAQFound = 1 then Do
  693.     If Upper(ToWho) = Upper(MyNick) then Do
  694.       "Raw Notice "Nick" : «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" - "Response
  695.     End
  696.     Else Do
  697.       "Say /Notice "ToWho" «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" - "Response
  698.     End
  699.   End
  700. End
  701. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"CONVERT") then Do
  702.   CnvtNum  = Word(Rest,2)
  703.   CnvtFrom = Upper(Word(Rest,3))
  704.   CnvtTo   = Upper(Word(Rest,4))
  705.   NewNum = "NOT!"
  706.   If Upper(CnvtNum) = "LIST" |  DataType(CnvtNum,"N") = 0 then do
  707.     'RAW NOTICE 'NICK' :Conversion options include the following.'
  708.     'RAW NOTICE 'NICK' :Measurements: 'd2c(2)'MM'd2c(2)','d2c(2)' CM'd2c(2)','d2c(2)' M'd2c(2)','d2c(2)' KM'd2c(2)' <--> 'd2c(2)'IN'd2c(2)','d2c(2)' FT'd2c(2)','d2c(2)' YD'd2c(2)','d2c(2)' MI'd2c(2)
  709.     'RAW NOTICE 'NICK' :Weights: 'd2c(2)'G'd2c(2)', 'd2c(2)'KG'd2c(2)' <--> 'd2c(2)'OZ'd2c(2)','d2c(2)' LB'd2c(2)
  710.     'RAW NOTICE 'NICK' :Temperature: 'd2c(2)'F'd2c(2)' <--> 'd2c(2)'C'd2c(2)' <--> 'd2c(2)'K'd2c(2)
  711.     'RAW NOTICE 'NICK' :Volume: 'd2c(2)'TSP'd2c(2)','d2c(2)' TBSP'd2c(2)','d2c(2)' FLOZ'd2c(2)','d2c(2)' CUP'd2c(2)','d2c(2)' PT'd2c(2)','d2c(2)' QT'd2c(2)','d2c(2)' GAL'd2c(2)' <--> 'd2c(2)'ML'd2c(2)','d2c(2)' L'd2c(2)
  712.     Signal MainLoop
  713.   End
  714.   If CnvtFrom = "F"    & CnvtTo = "C"    & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum - 32) * 5) / 9
  715.   If CnvtFrom = "F"    & CnvtTo = "K"    & DataType(CnvtNum,"N") = 1 then NewNum = (((CnvtNum - 32) * 5) / 9) + 273.15
  716.   If CnvtFrom = "C"    & CnvtTo = "F"    & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 9) / 5) + 32
  717.   If CnvtFrom = "C"    & CnvtTo = "K"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum + 273.15
  718.   If CnvtFrom = "K"    & CnvtTo = "C"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum - 273.15
  719.   If CnvtFrom = "K"    & CnvtTo = "F"    & DataType(CnvtNum,"N") = 1 then NewNum = (((CnvtNum - 273.15) * 9) / 5) + 32
  720.  
  721.   If CnvtFrom = "MM"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.039
  722.   If CnvtFrom = "MM"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.039) * 12
  723.   If CnvtFrom = "MM"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.039) * 36
  724.   If CnvtFrom = "MM"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.039) * 63360
  725.  
  726.   If CnvtFrom = "CM"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.39
  727.   If CnvtFrom = "CM"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.39) * 12
  728.   If CnvtFrom = "CM"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.39) * 36
  729.   If CnvtFrom = "CM"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.39) * 63360
  730.  
  731.   If CnvtFrom = "M"    & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 3.28) / 12
  732.   If CnvtFrom = "M"    & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3.28
  733.   If CnvtFrom = "M"    & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 3.28) * 3
  734.   If CnvtFrom = "M"    & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 3.28) * 5280
  735.  
  736.   If CnvtFrom = "KM"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.6) * 63360
  737.   If CnvtFrom = "KM"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.6) * 5280
  738.   If CnvtFrom = "KM"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.6) * 1760
  739.   If CnvtFrom = "KM"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.6
  740.  
  741.   If CnvtFrom = "IN"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 25.4
  742.   If CnvtFrom = "IN"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 25.4) / 10
  743.   If CnvtFrom = "IN"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 25.4) / 1000
  744.   If CnvtFrom = "IN"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 25.4) / 1000000
  745.   If CnvtFrom = "IN"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 12
  746.   If CnvtFrom = "IN"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 36
  747.   If CnvtFrom = "IN"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 63360
  748.  
  749.   If CnvtFrom = "FT"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.304) * 1000
  750.   If CnvtFrom = "FT"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.304) * 100
  751.   If CnvtFrom = "FT"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.304
  752.   If CnvtFrom = "FT"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.304) /1000
  753.   If CnvtFrom = "FT"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 12
  754.   If CnvtFrom = "FT"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 3
  755.   If CnvtFrom = "FT"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 5280
  756.  
  757.   If CnvtFrom = "YD"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.91) * 1000
  758.   If CnvtFrom = "YD"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.91) * 100
  759.   If CnvtFrom = "YD"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.91
  760.   If CnvtFrom = "YD"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.91) / 1000
  761.   If CnvtFrom = "YD"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 36
  762.   If CnvtFrom = "YD"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3
  763.   If CnvtFrom = "YD"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 1760
  764.  
  765.   If CnvtFrom = "MI"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 1.9) * 1000000
  766.   If CnvtFrom = "MI"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 1.9) * 100000
  767.   If CnvtFrom = "MI"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 1.9) * 1000
  768.   If CnvtFrom = "MI"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 1.9
  769.   If CnvtFrom = "MI"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 63360
  770.   If CnvtFrom = "MI"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 5280
  771.   If CnvtFrom = "MI"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 1760
  772.  
  773.   If CnvtFrom = "G"    & CnvtTo = "OZ"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.035
  774.   If CnvtFrom = "G"    & CnvtTo = "LB"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.035) / 16
  775.  
  776.   If CnvtFrom = "KG"   & CnvtTo = "OZ"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 35.2
  777.   If CnvtFrom = "KG"   & CnvtTo = "LB"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2.2
  778.  
  779.   If CnvtFrom = "OZ"   & CnvtTo = "G"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 28.44
  780.   If CnvtFrom = "OZ"   & CnvtTo = "KG"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 28.44) / 1000
  781.   If CnvtFrom = "OZ"   & CnvtTo = "LB"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  782.  
  783.   If CnvtFrom = "LB"   & CnvtTo = "G"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 455
  784.   If CnvtFrom = "LB"   & CnvtTo = "KG"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.455
  785.   If CnvtFrom = "LB"   & CnvtTo = "OZ"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  786.  
  787.   If CnvtFrom = "TSP"  & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 5
  788.   If CnvtFrom = "TSP"  & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 5) / 1000
  789.   If CnvtFrom = "TSP"  & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 3
  790.   If CnvtFrom = "TSP"  & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 6
  791.   If CnvtFrom = "TSP"  & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 48
  792.   If CnvtFrom = "TSP"  & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 96
  793.   If CnvtFrom = "TSP"  & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 192
  794.   If CnvtFrom = "TSP"  & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 768
  795.  
  796.   If CnvtFrom = "TBSP" & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 15
  797.   If CnvtFrom = "TBSP" & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 15) / 1000
  798.   If CnvtFrom = "TBSP" & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3
  799.   If CnvtFrom = "TBSP" & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 2
  800.   If CnvtFrom = "TBSP" & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  801.   If CnvtFrom = "TBSP" & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 32
  802.   If CnvtFrom = "TBSP" & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 64
  803.   If CnvtFrom = "TBSP" & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 256
  804.  
  805.   If CnvtFrom = "FLOZ" & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 30
  806.   If CnvtFrom = "FLOZ" & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 30) / 1000
  807.   If CnvtFrom = "FLOZ" & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 6
  808.   If CnvtFrom = "FLOZ" & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2
  809.   If CnvtFrom = "FLOZ" & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 8
  810.   If CnvtFrom = "FLOZ" & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  811.   If CnvtFrom = "FLOZ" & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 32
  812.   If CnvtFrom = "FLOZ" & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 128
  813.  
  814.   If CnvtFrom = "CUP"  & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 240
  815.   If CnvtFrom = "CUP"  & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * .24
  816.   If CnvtFrom = "CUP"  & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 48
  817.   If CnvtFrom = "CUP"  & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  818.   If CnvtFrom = "CUP"  & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 8
  819.   If CnvtFrom = "CUP"  & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 2
  820.   If CnvtFrom = "CUP"  & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 4
  821.   If CnvtFrom = "CUP"  & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  822.  
  823.   If CnvtFrom = "PT"   & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 470
  824.   If CnvtFrom = "PT"   & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * .47
  825.   If CnvtFrom = "PT"   & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 96
  826.   If CnvtFrom = "PT"   & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 32
  827.   If CnvtFrom = "PT"   & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  828.   If CnvtFrom = "PT"   & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2
  829.   If CnvtFrom = "PT"   & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 2
  830.   If CnvtFrom = "PT"   & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 8
  831.  
  832.   If CnvtFrom = "QT"   & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 950
  833.   If CnvtFrom = "QT"   & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * .95
  834.   If CnvtFrom = "QT"   & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 192
  835.   If CnvtFrom = "QT"   & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 64
  836.   If CnvtFrom = "QT"   & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 32
  837.   If CnvtFrom = "QT"   & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 4
  838.   If CnvtFrom = "QT"   & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2
  839.   If CnvtFrom = "QT"   & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 4
  840.  
  841.   If CnvtFrom = "GAL"  & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3800
  842.   If CnvtFrom = "GAL"  & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3.8
  843.   If CnvtFrom = "GAL"  & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 768
  844.   If CnvtFrom = "GAL"  & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 256
  845.   If CnvtFrom = "GAL"  & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 128
  846.   If CnvtFrom = "GAL"  & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  847.   If CnvtFrom = "GAL"  & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 8
  848.   If CnvtFrom = "GAL"  & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 4
  849.  
  850.   If CnvtFrom = "ML"   & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) * 6
  851.   If CnvtFrom = "ML"   & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) * 2
  852.   If CnvtFrom = "ML"   & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 30
  853.   If CnvtFrom = "ML"   & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 8
  854.   If CnvtFrom = "ML"   & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 16
  855.   If CnvtFrom = "ML"   & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 32
  856.   If CnvtFrom = "ML"   & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 128
  857.   If CnvtFrom = "ML"   & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 1000)
  858.  
  859.   If CnvtFrom = "L"    & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 1000
  860.   If CnvtFrom = "L"    & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) * 6
  861.   If CnvtFrom = "L"    & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) * 2
  862.   If CnvtFrom = "L"    & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30
  863.   If CnvtFrom = "L"    & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 8
  864.   If CnvtFrom = "L"    & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 16
  865.   If CnvtFrom = "L"    & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 32
  866.   If CnvtFrom = "L"    & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 128
  867.  
  868.   If NewNum ~= "NOT!" then Do
  869.     If NewNum < 0 then NewNum = NewNum - .0001
  870.     Else NewNum = NewNum + .0001
  871.     NewNum = Left(NewNum,Pos(".",NewNum)+2)
  872.     If Upper(ToWho) = Upper(MyNick) then Do
  873.       'RAW NOTICE 'NICK' :'d2c(2)||CnvtNum||' '||CnvtFrom||d2c(2)' is approximately 'd2c(2)||NewNum||' '||CnvtTo||d2c(2)
  874.     End
  875.     Else Do
  876.       'Say /Notice 'ToWho' 'NICK': 'd2c(2)||CnvtNum||' '||CnvtFrom||d2c(2)' is approximately 'd2c(2)||NewNum||' '||CnvtTo||d2c(2)
  877.     End
  878.   End
  879. End
  880. If (Type = "PRIVMSG") & ((Upper(Word(Rest,1)) = Trigger||"EXCHANGE") | (Upper(Word(Rest,1)) = Trigger||"CURRENCY")) then Do
  881.   Amount = Upper(Word(Rest,2))
  882.   Cur1 = Upper(Word(Rest,3))
  883.   Cur2 = Upper(Word(Rest,4))
  884.   CRNL = "0d0a"x
  885.  
  886.   If Amount = "" then Do
  887.     If Upper(ToWho) = Upper(MyNick) then "Raw Notice "Nick" :Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  888.     Else "Say /Notice "ToWho" "Nick": Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  889.     Signal MainLoop
  890.   End
  891.  
  892.   cntout = 0
  893.   IF Amount = 'LIST' THEN DO
  894.     IF UPPER(cur1) = "ALL" THEN DO
  895.       DO x = 1 to 70
  896.         'Raw Notice 'Nick' :'ratelist.x
  897.         Call Delay(35)
  898.       END
  899.       cntout = 1
  900.     END
  901.     ELSE DO x = 1 to 70
  902.       IF UPPER(cur1) = SUBSTR(ratelist.x,7,1) THEN DO
  903.         cntout = 1
  904.         'Raw Notice 'Nick' :'ratelist.x
  905.         Call Delay(35)
  906.       END
  907.     END
  908.     IF cntout = 0 THEN 'Raw Notice 'Nick' :No Country match for 'cur1
  909.   END
  910.   ELSE IF amount < 0 | amount > 100000000000000000 THEN DO
  911.     If Upper(ToWho) = Upper(MyNick) then Do
  912.       "Raw Notice "Nick" :I'm Sorry you entered an invalid amount..."
  913.       "Raw Notice "Nick" :Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  914.     End
  915.     Else Do
  916.       "Say /Notice "ToWho" "Nick": I'm Sorry you entered an invalid amount..."
  917.       "Say /Notice "ToWho" "Nick": Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  918.     End
  919.   END
  920.   ELSE DO
  921.     SELECT
  922.       WHEN Strip(Cur1) = "ARP" Then FromCurr = "Argentine Pesos"
  923.       WHEN Strip(Cur1) = "ATS" Then FromCurr = "Austrian Schillings"
  924.       WHEN Strip(Cur1) = "AUD" Then FromCurr = "Australian Dollars"
  925.       WHEN Strip(Cur1) = "BBD" Then FromCurr = "Barbados Dollars"
  926.       WHEN Strip(Cur1) = "BEF" Then FromCurr = "Belgium Francs"
  927.       WHEN Strip(Cur1) = "BGL" Then FromCurr = "Bulgarian Lev"
  928.       WHEN Strip(Cur1) = "BMD" Then FromCurr = "Bermuda Dollars"
  929.       WHEN Strip(Cur1) = "BRR" Then FromCurr = "Brazilian Real"
  930.       WHEN Strip(Cur1) = "BSD" Then FromCurr = "Bahamas Dollars"
  931.       WHEN Strip(Cur1) = "CAD" Then FromCurr = "Canadian Dollars"
  932.       WHEN Strip(Cur1) = "CHF" Then FromCurr = "Swiss Francs"
  933.       WHEN Strip(Cur1) = "CLP" Then FromCurr = "Chilean Pesos"
  934.       WHEN Strip(Cur1) = "CNY" Then FromCurr = "Chinese Yuan Renmimbi"
  935.       WHEN Strip(Cur1) = "CSK" Then FromCurr = "Czech Republic Koruna"
  936.       WHEN Strip(Cur1) = "CYP" Then FromCurr = "Cyprus Pounds"
  937.       WHEN Strip(Cur1) = "DEM" Then FromCurr = "German Deutsche Marks"
  938.       WHEN Strip(Cur1) = "DKK" Then FromCurr = "Danish Kroner"
  939.       WHEN Strip(Cur1) = "DZD" Then FromCurr = "Algerian Dinars"
  940.       WHEN Strip(Cur1) = "EGP" Then FromCurr = "Egyptian Pounds"
  941.       WHEN Strip(Cur1) = "ESP" Then FromCurr = "Spanish Pesetas"
  942.       WHEN Strip(Cur1) = "EUR" Then FromCurr = "European Currency"
  943.       WHEN Strip(Cur1) = "FIM" Then FromCurr = "Finnish Markka"
  944.       WHEN Strip(Cur1) = "FJD" Then FromCurr = "Fijian Dollars"
  945.       WHEN Strip(Cur1) = "FRF" Then FromCurr = "French Francs"
  946.       WHEN Strip(Cur1) = "GBP" Then FromCurr = "British Pounds"
  947.       WHEN Strip(Cur1) = "GRD" Then FromCurr = "Greek Drachmas"
  948.       WHEN Strip(Cur1) = "HKD" Then FromCurr = "Hong Kong Dollars"
  949.       WHEN Strip(Cur1) = "HUF" Then FromCurr = "Hungarian Forint"
  950.       WHEN Strip(Cur1) = "IDR" Then FromCurr = "Indonesian Rupiah"
  951.       WHEN Strip(Cur1) = "IEP" Then FromCurr = "Irish Punt"
  952.       WHEN Strip(Cur1) = "ILS" Then FromCurr = "Israeli New Shekels"
  953.       WHEN Strip(Cur1) = "INR" Then FromCurr = "Indian Rupees"
  954.       WHEN Strip(Cur1) = "ISK" Then FromCurr = "Icelandic Krona"
  955.       WHEN Strip(Cur1) = "ITL" Then FromCurr = "Italian Lira"
  956.       WHEN Strip(Cur1) = "JMD" Then FromCurr = "Jamaican Dollars"
  957.       WHEN Strip(Cur1) = "JOD" Then FromCurr = "Jordan Dinar"
  958.       WHEN Strip(Cur1) = "JPY" Then FromCurr = "Japanese Yen"
  959.       WHEN Strip(Cur1) = "KRW" Then FromCurr = "South Korean Won"
  960.       WHEN Strip(Cur1) = "LBP" Then FromCurr = "Lebanonise Pounds"
  961.       WHEN Strip(Cur1) = "LUF" Then FromCurr = "Luxembourg Francs"
  962.       WHEN Strip(Cur1) = "MXP" Then FromCurr = "Mexican Pesos"
  963.       WHEN Strip(Cur1) = "MYR" Then FromCurr = "Malaysian Ringgit"
  964.       WHEN Strip(Cur1) = "NLG" Then FromCurr = "Dutch Guilders"
  965.       WHEN Strip(Cur1) = "NOK" Then FromCurr = "Norwegian Kroner"
  966.       WHEN Strip(Cur1) = "NZD" Then FromCurr = "New Zealand Dollars"
  967.       WHEN Strip(Cur1) = "PHP" Then FromCurr = "Philippine Pesos"
  968.       WHEN Strip(Cur1) = "PKR" Then FromCurr = "Pakistan Rupees"
  969.       WHEN Strip(Cur1) = "PLZ" Then FromCurr = "Polish Zloty"
  970.       WHEN Strip(Cur1) = "PTE" Then FromCurr = "Portugese Escudo"
  971.       WHEN Strip(Cur1) = "ROL" Then FromCurr = "Romanian Leu"
  972.       WHEN Strip(Cur1) = "RUR" Then FromCurr = "Russian Rubles"
  973.       WHEN Strip(Cur1) = "SAR" Then FromCurr = "Saudi Arabian Riyal"
  974.       WHEN Strip(Cur1) = "SDD" Then FromCurr = "Sudanese Dinar"
  975.       WHEN Strip(Cur1) = "SEK" Then FromCurr = "Swedish Krona"
  976.       WHEN Strip(Cur1) = "SGD" Then FromCurr = "Singapore Dollars"
  977.       WHEN Strip(Cur1) = "SKK" Then FromCurr = "Slovakia Koruna"
  978.       WHEN Strip(Cur1) = "THB" Then FromCurr = "Thailand Baht"
  979.       WHEN Strip(Cur1) = "TRL" Then FromCurr = "Turkish Lira"
  980.       WHEN Strip(Cur1) = "TTD" Then FromCurr = "Trinidad and Tobago Dollars"
  981.       WHEN Strip(Cur1) = "TWD" Then FromCurr = "Taiwanese Dollars"
  982.       WHEN Strip(Cur1) = "USD" Then FromCurr = "American Dollars"
  983.       WHEN Strip(Cur1) = "VEB" Then FromCurr = "Venezuelan Bolivar"
  984.       WHEN Strip(Cur1) = "XAG" Then FromCurr = "Silver Ounces"
  985.       WHEN Strip(Cur1) = "XAU" Then FromCurr = "Gold Ounces"
  986.       WHEN Strip(Cur1) = "XCD" Then FromCurr = "Eastern Caribbean Dollars"
  987.       WHEN Strip(Cur1) = "XDR" Then FromCurr = "Special Drawing Right (IMF)"
  988.       WHEN Strip(Cur1) = "XPD" Then FromCurr = "Palladium Ounces"
  989.       WHEN Strip(Cur1) = "XPT" Then FromCurr = "Platinum Ounces"
  990.       WHEN Strip(Cur1) = "ZAR" Then FromCurr = "South African Rand"
  991.       WHEN Strip(Cur1) = "ZMK" Then FromCurr = "Zambia Kwacha"
  992.       OTHERWISE Do
  993.         'Raw Notice 'Nick' :'cur1 'is an unknown Country code. Try '||Trigger||'EXCHANGE LIST <ALL or Letter> where Letter is first letter of country you are looking for.'
  994.         Signal MainLoop
  995.       End
  996.     END
  997.  
  998.     SELECT
  999.       WHEN Strip(Cur2) = "ARP" Then ToCurr = "Argentine Pesos"
  1000.       WHEN Strip(Cur2) = "ATS" Then ToCurr = "Austrian Schillings"
  1001.       WHEN Strip(Cur2) = "AUD" Then ToCurr = "Australian Dollars"
  1002.       WHEN Strip(Cur2) = "BBD" Then ToCurr = "Barbados Dollars"
  1003.       WHEN Strip(Cur2) = "BEF" Then ToCurr = "Belgium Francs"
  1004.       WHEN Strip(Cur2) = "BGL" Then ToCurr = "Bulgarian Lev"
  1005.       WHEN Strip(Cur2) = "BMD" Then ToCurr = "Bermuda Dollars"
  1006.       WHEN Strip(Cur2) = "BRR" Then ToCurr = "Brazilian Real"
  1007.       WHEN Strip(Cur2) = "BSD" Then ToCurr = "Bahamas Dollars"
  1008.       WHEN Strip(Cur2) = "CAD" Then ToCurr = "Canadian Dollars"
  1009.       WHEN Strip(Cur2) = "CHF" Then ToCurr = "Swiss Francs"
  1010.       WHEN Strip(Cur2) = "CLP" Then ToCurr = "Chilean Pesos"
  1011.       WHEN Strip(Cur2) = "CNY" Then ToCurr = "Chinese Yuan Renmimbi"
  1012.       WHEN Strip(Cur2) = "CSK" Then ToCurr = "Czech Republic Koruna"
  1013.       WHEN Strip(Cur2) = "CYP" Then ToCurr = "Cyprus Pounds"
  1014.       WHEN Strip(Cur2) = "DEM" Then ToCurr = "German Deutsche Marks"
  1015.       WHEN Strip(Cur2) = "DKK" Then ToCurr = "Danish Kroner"
  1016.       WHEN Strip(Cur2) = "DZD" Then ToCurr = "Algerian Dinars"
  1017.       WHEN Strip(Cur2) = "EGP" Then ToCurr = "Egyptian Pounds"
  1018.       WHEN Strip(Cur2) = "ESP" Then ToCurr = "Spanish Pesetas"
  1019.       WHEN Strip(Cur2) = "EUR" Then ToCurr = "European Currency"
  1020.       WHEN Strip(Cur2) = "FIM" Then ToCurr = "Finnish Markka"
  1021.       WHEN Strip(Cur2) = "FJD" Then ToCurr = "Fijian Dollars"
  1022.       WHEN Strip(Cur2) = "FRF" Then ToCurr = "French Francs"
  1023.       WHEN Strip(Cur2) = "GBP" Then ToCurr = "British Pounds"
  1024.       WHEN Strip(Cur2) = "GRD" Then ToCurr = "Greek Drachmas"
  1025.       WHEN Strip(Cur2) = "HKD" Then ToCurr = "Hong Kong Dollars"
  1026.       WHEN Strip(Cur2) = "HUF" Then ToCurr = "Hungarian Forint"
  1027.       WHEN Strip(Cur2) = "IDR" Then ToCurr = "Indonesian Rupiah"
  1028.       WHEN Strip(Cur2) = "IEP" Then ToCurr = "Irish Punt"
  1029.       WHEN Strip(Cur2) = "ILS" Then ToCurr = "Israeli New Shekels"
  1030.       WHEN Strip(Cur2) = "INR" Then ToCurr = "Indian Rupees"
  1031.       WHEN Strip(Cur2) = "ISK" Then ToCurr = "Icelandic Krona"
  1032.       WHEN Strip(Cur2) = "ITL" Then ToCurr = "Italian Lira"
  1033.       WHEN Strip(Cur2) = "JMD" Then ToCurr = "Jamaican Dollars"
  1034.       WHEN Strip(Cur2) = "JOD" Then ToCurr = "Jordan Dinar"
  1035.       WHEN Strip(Cur2) = "JPY" Then ToCurr = "Japanese Yen"
  1036.       WHEN Strip(Cur2) = "KRW" Then ToCurr = "South Korean Won"
  1037.       WHEN Strip(Cur2) = "LBP" Then ToCurr = "Lebanonise Pounds"
  1038.       WHEN Strip(Cur2) = "LUF" Then ToCurr = "Luxembourg Francs"
  1039.       WHEN Strip(Cur2) = "MXP" Then ToCurr = "Mexican Pesos"
  1040.       WHEN Strip(Cur2) = "MYR" Then ToCurr = "Malaysian Ringgit"
  1041.       WHEN Strip(Cur2) = "NLG" Then ToCurr = "Dutch Guilders"
  1042.       WHEN Strip(Cur2) = "NOK" Then ToCurr = "Norwegian Kroner"
  1043.       WHEN Strip(Cur2) = "NZD" Then ToCurr = "New Zealand Dollars"
  1044.       WHEN Strip(Cur2) = "PHP" Then ToCurr = "Philippine Pesos"
  1045.       WHEN Strip(Cur2) = "PKR" Then ToCurr = "Pakistan Rupees"
  1046.       WHEN Strip(Cur2) = "PLZ" Then ToCurr = "Polish Zloty"
  1047.       WHEN Strip(Cur2) = "PTE" Then ToCurr = "Portugese Escudo"
  1048.       WHEN Strip(Cur2) = "ROL" Then ToCurr = "Romanian Leu"
  1049.       WHEN Strip(Cur2) = "RUR" Then ToCurr = "Russian Rubles"
  1050.       WHEN Strip(Cur2) = "SAR" Then ToCurr = "Saudi Arabian Riyal"
  1051.       WHEN Strip(Cur2) = "SDD" Then ToCurr = "Sudanese Dinar"
  1052.       WHEN Strip(Cur2) = "SEK" Then ToCurr = "Swedish Krona"
  1053.       WHEN Strip(Cur2) = "SGD" Then ToCurr = "Singapore Dollars"
  1054.       WHEN Strip(Cur2) = "SKK" Then ToCurr = "Slovakia Koruna"
  1055.       WHEN Strip(Cur2) = "THB" Then ToCurr = "Thailand Baht"
  1056.       WHEN Strip(Cur2) = "TRL" Then ToCurr = "Turkish Lira"
  1057.       WHEN Strip(Cur2) = "TTD" Then ToCurr = "Trinidad and Tobago Dollars"
  1058.       WHEN Strip(Cur2) = "TWD" Then ToCurr = "Taiwanese Dollars"
  1059.       WHEN Strip(Cur2) = "USD" Then ToCurr = "American Dollars"
  1060.       WHEN Strip(Cur2) = "VEB" Then ToCurr = "Venezuelan Bolivar"
  1061.       WHEN Strip(Cur2) = "XAG" Then ToCurr = "Silver Ounces"
  1062.       WHEN Strip(Cur2) = "XAU" Then ToCurr = "Gold Ounces"
  1063.       WHEN Strip(Cur2) = "XCD" Then ToCurr = "Eastern Caribbean Dollars"
  1064.       WHEN Strip(Cur2) = "XDR" Then ToCurr = "Special Drawing Right (IMF)"
  1065.       WHEN Strip(Cur2) = "XPD" Then ToCurr = "Palladium Ounces"
  1066.       WHEN Strip(Cur2) = "XPT" Then ToCurr = "Platinum Ounces"
  1067.       WHEN Strip(Cur2) = "ZAR" Then ToCurr = "South African Rand"
  1068.       WHEN Strip(Cur2) = "ZMK" Then ToCurr = "Zambia Kwacha"
  1069.       OTHERWISE Do
  1070.         'Raw Notice 'Nick' :'cur2 'is an unknown Country code. Try '||Trigger||'EXCHANGE LIST <ALL or Letter> where Letter is first letter of country you are looking for.'
  1071.         Signal MainLoop
  1072.       End
  1073.     END
  1074.  
  1075.     ratesendline ='Amount='amount'&From='cur1'&To='cur2
  1076.     contentlength = length(ratesendline)
  1077.  
  1078.     IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1079.     IF SHOWLIST(H,'TCP') THEN DO
  1080.       IF OPEN(1,'TCP:www.xe.net/80','W') THEN DO
  1081.         CALL WRITECH(1,'POST /cgi-bin/ucc/convert HTTP/1.0')
  1082.         CALL WRITECH(1,'User-Agent: CTCP-Master/1.10; (AmIRC Extension Package)'||crnl)
  1083.         CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1084.         CALL WRITECH(1,'Host: www.xe.net'||crnl)
  1085.         CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1086.         CALL WRITECH(1,'Content-Type: application/x-www-form-urlencodedwidth'||crnl)
  1087.         CALL WRITECH(1,crnl)
  1088.         CALL WRITECH(1,ratesendline||crnl)
  1089.  
  1090.         txt=READLN(1)
  1091.         IF SUBWORD(txt,2,1)='500' THEN DO
  1092.           'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1093.           CALL WRITELN(1,'Quit')
  1094.           CALL CLOSE(1)
  1095.         END
  1096.         ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1097.           DO UNTIL EOF(1)
  1098.             txt=READLN(1)
  1099.             IF subword(txt,2,2)='as of' THEN DO
  1100.               OnDate = Translate(Date("N",Compress(Word(txt,4),"."),"S"),"-"," ")
  1101.             END
  1102.             IF Left(Word(txt,8),3) = cur1 then Do
  1103.                parse var txt blah '<B>' d1 '</B>' blah .
  1104.             END
  1105.             IF Left(Word(txt,8),3) = cur2 then Do
  1106.                parse var txt blah '<B>' d2 '</B>' blah .
  1107.                d2 = left(word(d2,1),pos(".",d2)+2)||" "||word(d2,2)
  1108.             END
  1109.           END
  1110.           CALL WRITELN(1,'Quit')
  1111.           CALL CLOSE(1)
  1112.           dataline = d1||' ('||FromCurr||') is worth '||d2||' ('||ToCurr||')'
  1113.           If Upper(ToWho) = Upper(MyNick) then 'Raw Notice 'Nick' :On 'OnDate',' dataline 'at http://www.xe.net/ucc/'
  1114.           Else 'Say /Notice 'ToWho' 'Nick': On 'OnDate',' dataline 'at http://www.xe.net/ucc/'
  1115.         END
  1116.       END
  1117.     END
  1118.   END
  1119. END
  1120. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"TEMP") then Do
  1121.   CityZip = SubWord(Rest,2)
  1122.   ZIP = Translate(CityZip,"+"," ")
  1123.   NewCity = "NOWHERE"
  1124.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1125.   IF SHOWLIST(H,'TCP') THEN DO
  1126.     IF OPEN(1,'TCP:www.wunderground.com/80','W') THEN DO
  1127.       CALL WRITECH(1,'GET /cgi-bin/findweather/getForecast?query='ZIP' HTTP/1.1')
  1128.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.10; (AmIRC Extension Package)'||crnl)
  1129.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1130.       CALL WRITECH(1,'Accept-Language: en'||crnl)
  1131.       CALL WRITECH(1,'Host: www.wunderground.com'||crnl)
  1132.       CALL WRITECH(1,'Referer: http://www.wunderground.com/cgi-bin/findweather/getForecast?query='ZIP||crnl)
  1133.       CALL WRITECH(1,crnl)
  1134.  
  1135.       txt=READLN(1)
  1136.       IF SUBWORD(txt,2,1)='500' THEN DO
  1137.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1138.         CALL WRITELN(1,'Quit')
  1139.         CALL CLOSE(1)
  1140.       END
  1141.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1142.         DO UNTIL EOF(1)
  1143.           txt=READLN(1)
  1144.           If txt ~= "" then Do
  1145.             IF Left(txt,37) = '<td><b><font size="+1" color=#ffffff>' Then Do
  1146.               Parse VAR txt '<td><b><font size="+1" color=#ffffff>'Location' Forecast'
  1147.             End
  1148.             IF txt='<tr ><td>Temperature</td>' THEN DO
  1149.               txt = readln(1)
  1150.               Parse VAR txt 'F / <b>'CTemp'</b>'
  1151.               Parse VAR txt '<td><b>'FTemp'</b>'
  1152.               Parse VAR FTemp FTemp'°'
  1153.               If CTemp = "" then Temperature = FTemp||"°F"
  1154.               Else Temperature = FTemp||"°F / "CTemp"°C"
  1155.               NewCity = "FOUND"
  1156.               Leave
  1157.             END
  1158.             IF Left(txt,28)='<tr bgcolor=#ffffff  ><td  >' Then Do
  1159.               Parse VAR txt '.html">'Location'</a>'
  1160.               Parse VAR txt 'F / 'CTemp'° C'
  1161.               Parse VAR txt '<td>'FTemp'° F'
  1162.               If CTemp = "" then Temperature = FTemp||"°F"
  1163.               Else Temperature = FTemp||"°F / "CTemp"°C"
  1164.               NewCity = "FOUND"
  1165.               Leave
  1166.             END
  1167.             IF txt="We're sorry but the page you requested was not found." THEN DO
  1168.               NewCity = 'NOWHERE'
  1169.               Leave
  1170.             END
  1171.           END
  1172.         END
  1173.         CALL WRITELN(1,'Quit')
  1174.         CALL CLOSE(1)
  1175.         If NewCity = 'FOUND' then Do
  1176.           If Upper(ToWho) = Upper(MyNick) then 'Raw Notice 'Nick' :Temperature for 'Location': currently 'Temperature'.'
  1177.           Else 'Say /Notice 'ToWho' 'Nick': Temperature for 'Location': currently 'Temperature'.'
  1178.         End
  1179.         Else Do
  1180.           If Upper(ToWho) = Upper(MyNick) then 'Raw Notice 'Nick' :Sorry, 'CityZip' was not found in the weather database.'
  1181.           Else 'Say /Notice 'ToWho' 'Nick': Sorry, 'CityZip' was not found in the weather database.'
  1182.         END
  1183.       END
  1184.     END
  1185.   END
  1186. End
  1187. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"ZIP") then Do
  1188.   ZIP = Word(Rest,2)
  1189.   sendline = "ctystzip="zip"&Submit=Process"
  1190.   contentlength = length(sendline)
  1191.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1192.   IF SHOWLIST(H,'TCP') THEN DO
  1193.     IF OPEN(1,'TCP:www.usps.gov/80','W') THEN DO
  1194.       CALL WRITECH(1,'POST /cgi-bin/zip4/ctystzip2 HTTP/1.0')
  1195.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.10; (AmIRC Extension Package)'||crnl)
  1196.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1197.       CALL WRITECH(1,'Accept-Language: en'||crnl)
  1198.       CALL WRITECH(1,'Host: www.usps.gov'||crnl)
  1199.       CALL WRITECH(1,'Referer: http://www.usps.gov/ncsc/lookups/lookup_ctystzip.html'||crnl)
  1200.       CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1201.       CALL WRITECH(1,'Content-Type: application/x-www-form-urlencodedwidth'||crnl)
  1202.       CALL WRITECH(1,crnl)
  1203.       CALL WRITECH(1,sendline||crnl)
  1204.  
  1205.       txt=READLN(1)
  1206.       IF SUBWORD(txt,2,1)='500' THEN DO
  1207.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1208.         CALL WRITELN(1,'Quit')
  1209.         CALL CLOSE(1)
  1210.       END
  1211.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1212.         DO UNTIL EOF(1)
  1213.           txt=READLN(1)
  1214.           If txt ~= "" then Do
  1215.             IF subword(txt,1,4)='For this ZIP Code,' THEN DO
  1216.               Parse VAR txt '<BR>'City'ACCEPTABLE'
  1217.               NewCity = SubWord(City,1,Words(City)-1)||", "Word(City,Words(City))
  1218.               Leave
  1219.             END
  1220.             IF subword(txt,1,4)='The ZIP Code you' THEN DO
  1221.               NewCity = 'NOWHERE'
  1222.               Leave
  1223.             END
  1224.           END
  1225.         END
  1226.         CALL WRITELN(1,'Quit')
  1227.         CALL CLOSE(1)
  1228.         If NewCity ~='NOWHERE' then Do
  1229.           If Upper(ToWho) = Upper(MyNick) then 'Raw Notice 'Nick' :Zip Code 'Zip' is assigned to 'NewCity'.'
  1230.           Else 'Say /Notice 'ToWho' 'Nick': Zip Code 'Zip' is assigned to 'NewCity'.'
  1231.         End
  1232.         Else Do
  1233.           If Upper(ToWho) = Upper(MyNick) then 'Raw Notice 'Nick' :Zip Code 'Zip' is not currently assigned.'
  1234.           Else 'Say /Notice 'ToWho' 'Nick': Zip Code 'Zip' is not currently assigned.'
  1235.         END
  1236.       END
  1237.     END
  1238.   END
  1239. End
  1240. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FIND") then Do
  1241.   Target = SubWord(Rest,2)
  1242.   CRNL = "0d0a"x
  1243.   sendline ='find?'||Target
  1244.   contentlength = length(sendline)
  1245.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1246.   IF SHOWLIST(H,'TCP') THEN DO
  1247.     IF OPEN(1,'TCP:ftp.uni-paderborn.de/80','W') THEN DO
  1248.       CALL WRITECH(1,'POST /aminetbin/find?'||Target||' HTTP/1.0')
  1249.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.10; (AmIRC Extension Package)'||crnl)
  1250.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1251.       CALL WRITECH(1,'Host: wuarchive.wustl.edu'||crnl)
  1252.       CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1253.       CALL WRITECH(1,'Content-Type: application/x-www-form-urlencodedwidth'||crnl)
  1254.       CALL WRITECH(1,crnl)
  1255.       CALL WRITECH(1,sendline||crnl)
  1256.       txt=READLN(1)
  1257.       IF SUBWORD(txt,2,1)='500' THEN DO
  1258.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1259.         CALL WRITELN(1,'Quit')
  1260.         CALL CLOSE(1)
  1261.       END
  1262.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1263.         Report = 0
  1264.         DO UNTIL EOF(1)
  1265.           txt=READLN(1)
  1266.           If Length(txt) > 0 then DO
  1267.             If Words(txt) >= 4 THEN DO
  1268.               If Word(txt,1) = "First" & SubWord(txt,3,2) = "files matching" then Do
  1269.                 'Raw Notice 'Nick' :Over 'SubWord(txt,2,3)' 'Target'.'
  1270.                 'Raw Notice 'Nick' :First 10 matches are listed.'
  1271.               End
  1272.               If SubWord(txt,2,2)='files matching' THEN DO
  1273.                 FoundFiles = Word(txt,1)
  1274.                 'Raw Notice 'Nick' :'SubWord(txt,1,4)
  1275.                 If FoundFiles > 10 Then 'Raw Notice 'Nick' :First 10 matches are listed.'
  1276.               END
  1277.             END
  1278.             IF Word(txt,1)='<hr><a' THEN DO
  1279.               txt = SubStr(txt,5)
  1280.             END
  1281.             If Left(txt,8)='<a href=' THEN DO
  1282.               FilePath = SubStr(txt,21,Pos(">",txt)-22)
  1283.               FilePath = SubStr(FilePath,LastPos("/",FilePath)+1)
  1284.               FileComment = Word(txt,7)
  1285.               FileComment = SubStr(FileComment,Pos(">",FileComment)+1)
  1286.               FileComment = FileComment||" "||subWord(txt,8)
  1287.               FileComment = Left(FileComment,Length(FileComment)-4)
  1288.               FileComment = Left(FileComment,44)
  1289.               'Raw Notice 'Nick' :'FilePath||Copies(" ",25 - Length(FilePath))||Word(txt,3)||Copies(" ",10 - Length(Word(txt,3)))||Right(Word(txt,4),7)||"  "||FileComment
  1290.               Report = Report + 1
  1291.               Call Delay(75)
  1292.               If Report > 9 then Leave
  1293.             END
  1294.           END
  1295.         END
  1296.         CALL WRITELN(1,'Quit')
  1297.         CALL CLOSE(1)
  1298.       END
  1299.     END
  1300.     Else 'Echo Failed to connect to Aminet!'
  1301.   END
  1302. END
  1303. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"MONTH") then Do
  1304.   Call Calendar
  1305. End
  1306. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"TRANSLATE") then Do
  1307.   FromLang = Translate(Word(Rest,2),XRange("a","z"),XRange("A","Z"))
  1308.   ToLang = Translate(Word(Rest,3),XRange("a","z"),XRange("A","Z"))
  1309.   If FromLang = "from" then Do
  1310.     If ToLang = "spanish" then FromLang = "es"
  1311.     If ToLang = "french" then FromLang = "fr"
  1312.     If ToLang = "italian" then FromLang = "it"
  1313.     If ToLang = "german" then FromLang = "de"
  1314.     If ToLang = "portuguese" then FromLang = "pt"
  1315.     ToLang = "en"
  1316.   End
  1317.   If FromLang = "to" then Do
  1318.     If ToLang = "spanish" then ToLang = "es"
  1319.     If ToLang = "french" then ToLang = "fr"
  1320.     If ToLang = "italian" then ToLang = "it"
  1321.     If ToLang = "german" then ToLang = "de"
  1322.     If ToLang = "portuguese" then ToLang = "pt"
  1323.     FromLang = "en"
  1324.   End
  1325.   If FromLang ~= "es" & FromLang ~= "en" & FromLang ~= "fr" & FromLang ~= "de" & FromLang ~= "it" & FromLang ~= "pt" & ToLang ~= "es" & ToLang ~= "en" & ToLang ~= "fr" & ToLang ~= "de" & ToLang ~= "it" & ToLang ~= "pt" Then Do
  1326.     If Upper(ToWho) = Upper(MyNick) then Do
  1327.       'Raw Notice 'Nick' :Invalid language option.  EN-English, ES-Spanish, FR-French, DE-German, IT-Italian, or PT-Portuguese'
  1328.       'Raw Notice 'Nick' :Format is  '||Trigger||'TRANSLATE {From} {To} {Text to translate}'
  1329.       'Raw Notice 'Nick' :You must translate to or from English'
  1330.     End
  1331.     Else Do
  1332.       'Say /Notice 'ToWho' 'Nick': Invalid language option.  EN-English, ES-Spanish, FR-French, DE-German, IT-Italian, or PT-Portuguese'
  1333.       'Say /Notice 'ToWho' 'Nick': Format is  '||Trigger||'TRANSLATE {From} {To} {Text to translate}'
  1334.       'Say /Notice 'ToWho' 'Nick': You must translate to or from English'
  1335.     End
  1336.   End
  1337.   Phrase = Translate(SubWord(Rest,4),"+"," ")
  1338.   CRNL = "0d0a"x
  1339.   sendline ="doit=done&urltext="Phrase"&lp="FromLang"_"ToLang
  1340.   contentlength = length(sendline)
  1341.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1342.   IF SHOWLIST(H,'TCP') THEN DO
  1343.     IF OPEN(1,'TCP:babelfish.altavista.com/80','W') THEN DO
  1344.       CALL WRITECH(1,'POST /cgi-bin/translate? HTTP/1.0')
  1345.       CALL WRITECH(1,'Referer: http://babelfish.altavista.com/cgi-bin/translate?'||sendline||crnl)
  1346.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.10; (AmIRC Extension Package)'||crnl)
  1347.       CALL WRITECH(1,'Host: babelfish.altavista.com'||crnl)
  1348.       CALL WRITECH(1,'If-Modified-Since: 'Left(Date(W),3)||' '||Date()||' 'Time()' GMT'||crnl)
  1349.       CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1350.       CALL WRITECH(1,'Content-Type: application/x-www-form-urlencoded'||crnl)
  1351.       CALL WRITECH(1,'Accept: text/html;level=3'||crnl)
  1352.       CALL WRITECH(1,'Accept: text/html;version=3.0'||crnl)
  1353.       CALL WRITECH(1,'Accept: */*'||crnl)
  1354.       CALL WRITECH(1,crnl)
  1355.       CALL WRITECH(1,sendline)
  1356.       txt=READLN(1)
  1357.       IF SUBWORD(txt,2,1)='500' THEN DO
  1358.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1359.         CALL WRITELN(1,'Quit')
  1360.         CALL CLOSE(1)
  1361.       END
  1362.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1363.         Report = 0
  1364.         DO UNTIL EOF(1)
  1365.           txt=READLN(1)
  1366.           If Length(txt) > 30 then DO
  1367.             If Left(txt,30) = '<font face="arial, helvetica">' & Right(txt,7) ~= "</font>" THEN DO
  1368.               NewPhrase = SubStr(txt,31)
  1369.               Do Forever
  1370.                 txt=READLN(1)
  1371.                 If Left(txt,8) = "<br><br>" then Break
  1372.                 NewPhrase = NewPhrase||" "||txt
  1373.               End
  1374.               If Upper(ToWho) = Upper(MyNick) then 'Raw Notice 'Nick' :Translation is "'NewPhrase'"'
  1375.               Else 'Say /Notice 'ToWho' 'Nick': Translation is "'NewPhrase'"'
  1376.             END
  1377.           END
  1378.         END
  1379.         CALL WRITELN(1,'Quit')
  1380.         CALL CLOSE(1)
  1381.       END
  1382.     END
  1383.     Else 'Echo Failed to connect to Altavista!'
  1384.   END
  1385. END
  1386.  
  1387. LastLine = Line
  1388. Signal MainLoop
  1389.  
  1390. ReadOPs:
  1391. NumOps = 0
  1392. If Exists("AmIRC:Rexx/CTCP-OPsList") then Do
  1393.   Call Open(Ops,"AmIRC:Rexx/CTCP-OPsList","R")
  1394.     NumOps = 1
  1395.     Do Until EOF(Ops)
  1396.       Line = ReadLn(Ops)
  1397.       If Left(Line,1) = ";" then Iterate
  1398.       If Left(Line,1) = "#" then Do
  1399.         OpChannel.NumOps = Word(Line,1)
  1400.         OpHost.NumOps    = Word(Line,2)
  1401.         OpNick.NumOps    = Word(Line,3)
  1402.         NumOps = NumOps + 1
  1403.       End
  1404.     End
  1405.   Call Close(Ops)
  1406.   NumOps = NumOps - 1
  1407.   If NumOps = 1 then 'ECHO P='d2c(27)'b«CTCPMaster» Monitoring 'NumOps' Auto-OP Hostmask...'
  1408.   Else 'ECHO P='d2c(27)'b«CTCPMaster» Monitoring 'NumOps' Auto-OP Hostmasks...'
  1409. End
  1410. Return
  1411.  
  1412. WriteOps:
  1413. Call Open(Ops,"AmIRC:Rexx/CTCP-OPsList","W")
  1414.   Call WriteLn(Ops,"; List of people to Auto-OP and on which channel.")
  1415.   Call WriteLn(Ops,"; Entries are not case sensitive.")
  1416.   Call WriteLn(Ops,";")
  1417.   Call WriteLn(Ops,";Channel        HostMask                       Nick")
  1418.   Call WriteLn(Ops,";-------------- ------------------------------ -------------------")
  1419.   Do Loop = 1 to NumOps
  1420.     Call WriteLn(Ops,Left(OpChannel.Loop,15)||" "||Left(OpHost.Loop,30)||" "||OpNick.Loop)
  1421.   End
  1422. Call Close(Ops)
  1423. Return
  1424.  
  1425. GetMask:
  1426. HA = Translate(HA,XRange("a","z"),XRange("A","Z"))
  1427. HA = Strip(HA,"L","~")
  1428. HA2 = SubStr(HA,Pos("@",HA)+1)
  1429. User = Left(HA,Pos("@",HA)-1)
  1430. HA = Translate(HA2,"  ","@.")
  1431. Number = 0
  1432. Found = 0
  1433. If Words(HA) = 4 then Do
  1434.   If Datatype(Compress(HA),"N") = 1 then Do
  1435.     HATemp = User"@"HA2
  1436.     Found = 1
  1437.   End
  1438. End
  1439. If Found = 0 then Do
  1440.   Do Loop = 1 to Words(HA)
  1441.     Do X = 0 to 9
  1442.       If Pos(X,Word(HA,Loop)) > 0 then Number = Loop
  1443.     End
  1444.   End
  1445.   If Number ~= 0 then Do
  1446.     HATemp = User"@*"
  1447.     Do Loop = Number +1 to Words(HA)
  1448.       HATemp = HATemp||"."Word(HA,Loop)
  1449.     End
  1450.     Found = 1
  1451.   End
  1452. End
  1453. If Found = 1 then HA = HATemp
  1454. Else HA = USER||"@"||HA2
  1455. Return
  1456.  
  1457. Calendar:
  1458. Now = Date("S")
  1459. Year = Left(Now,4)
  1460. Mon = SubStr(Now,5,2)
  1461. Today = Right(Now,2)
  1462. If Left(Mon,1) = 0 then Mon = Right(Mon,1)
  1463. If Left(Today,1) = 0 then Today = Right(Today,1)
  1464. If Year < 1978 then Year = 1978
  1465.  
  1466. Month.1 = 31
  1467. Month.2 = 28
  1468. Month.3 = 31
  1469. Month.4 = 30
  1470. Month.5 = 31
  1471. Month.6 = 30
  1472. Month.7 = 31
  1473. Month.8 = 31
  1474. Month.9 = 30
  1475. Month.10= 31
  1476. Month.11= 30
  1477. Month.12= 31
  1478.  
  1479. If (Year/4 = Year%4) then Do
  1480.   Month.2 = 29
  1481.   If (Year/100 = Year%100) then Do
  1482.     If (Year/400 ~= Year%400) then Month.2 = 28
  1483.   End
  1484. End
  1485.  
  1486. Day = Date("W",Year||Right("00"||Mon,2)||"01","S")
  1487. Select
  1488.  When Day = "Sunday" then Buffer = 0
  1489.  When Day = "Monday" then Buffer = 1
  1490.  When Day = "Tuesday" then Buffer = 2
  1491.  When Day = "Wednesday" then Buffer = 3
  1492.  When Day = "Thursday" then Buffer = 4
  1493.  When Day = "Friday" then Buffer = 5
  1494.  When Day = "Saturday" then Buffer = 6
  1495.  Otherwise NOP
  1496. End
  1497. Hot = ((Today + Buffer) * 2 ) - 1
  1498.  
  1499. Dates = Copies("  ",Buffer)||Left(" 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031",Month.Mon * 2)
  1500.  
  1501. Count = 0
  1502. 'ECHO P='d2c(27)'b«CTCPMaster» Sending the Calendar to 'Nick'...'
  1503. 'Raw Notice 'Nick' :          'Date('M')||' 'Year
  1504. 'Raw Notice 'Nick' :Sun  Mon  Tues Weds Thur Fri  Sat'
  1505. Week = " "
  1506. Do Loop = 1 to Length(Dates) by 2
  1507.   If Loop = Hot then Week = Week||D2C(22)||SubStr(Dates,Loop,2)||D2C(22)||"   "
  1508.   Else Week = Week||SubStr(Dates,Loop,2)"   "
  1509.   Count = Count + 1
  1510.   If Count = 7 then Do
  1511.     Count = 0
  1512.     'Raw Notice 'Nick' :'Week
  1513.     Week = " "
  1514.   End
  1515. End
  1516. If Week ~= " " then 'Raw Notice 'Nick' :'Week
  1517. Return
  1518.  
  1519. Halt:
  1520. Syntax:
  1521. Error:
  1522. Call ClosePort("CTCP-MASTER")
  1523. ErrorLine= SigL
  1524. 'ECHO P='d2c(27)'b«CTCPMaster» Exiting...Error in line 'ErrorLine'!'
  1525. Exit
  1526.  
  1527. RateList:
  1528.  
  1529. ratelist.1 = "ARP = Argentina Pesos"
  1530. ratelist.2 = "ATS = Austria Schillings"
  1531. ratelist.3 = "AUD = Australia Dollars"
  1532. ratelist.4 = "BBD = Barbados Dollars"
  1533. ratelist.5 = "BEF = Belgium Francs"
  1534. ratelist.6 = "BGL = Bulgaria Lev"
  1535. ratelist.7 = "BMD = Bermuda Dollars"
  1536. ratelist.8 = "BRR = Brazil Real"
  1537. ratelist.9 = "BSD = Bahamas Dollars"
  1538. ratelist.10 = "CAD = Canada Dollars"
  1539. ratelist.11 = "CHF = Switzerland Francs"
  1540. ratelist.12 = "CLP = Chile Pesos"
  1541. ratelist.13 = "CNY = China Yuan Renmimbi"
  1542. ratelist.14 = "CSK = Czech Republic Koruna"
  1543. ratelist.15 = "CYP = Cyprus Pounds"
  1544. ratelist.16 = "DEM = Germany Deutsche Marks"
  1545. ratelist.17 = "DKK = Denmark Kroner"
  1546. ratelist.18 = "DZD = Algeria Dinars"
  1547. ratelist.19 = "EGP = Egypt Pounds"
  1548. ratelist.20 = "ESP = Spain Pesetas"
  1549. ratelist.21 = "EUR = Euro"
  1550. ratelist.22 = "FIM = Finland Markka"
  1551. ratelist.23 = "FJD = Fiji Dollars"
  1552. ratelist.24 = "FRF = France Francs"
  1553. ratelist.25 = "GBP = United Kingdom Pounds"
  1554. ratelist.26 = "GRD = Greece Drachmas"
  1555. ratelist.27 = "HKD = Hong Kong Dollars"
  1556. ratelist.28 = "HUF = Hungary Forint"
  1557. ratelist.29 = "IDR = Indonesia Rupiah"
  1558. ratelist.30 = "IEP = Ireland Punt"
  1559. ratelist.31 = "ILS = Israel New Shekels"
  1560. ratelist.32 = "INR = India Rupees"
  1561. ratelist.33 = "ISK = Iceland Krona"
  1562. ratelist.34 = "ITL = Italy Lira"
  1563. ratelist.35 = "JMD = Jamaica Dollars"
  1564. ratelist.36 = "JOD = Jordan Dinar"
  1565. ratelist.37 = "JPY = Japan Yen"
  1566. ratelist.38 = "KRW = South Korea Won"
  1567. ratelist.39 = "LBP = Lebanon Pounds"
  1568. ratelist.40 = "LUF = Luxembourg Francs"
  1569. ratelist.41 = "MXP = Mexico Pesos"
  1570. ratelist.42 = "MYR = Malaysia Ringgit"
  1571. ratelist.43 = "NLG = Dutch Guilders"
  1572. ratelist.44 = "NOK = Norway Kroner"
  1573. ratelist.45 = "NZD = New Zealand Dollars"
  1574. ratelist.46 = "PHP = Philippines Pesos"
  1575. ratelist.47 = "PKR = Pakistan Rupees"
  1576. ratelist.48 = "PLZ = Poland Zloty"
  1577. ratelist.49 = "PTE = Portugal Escudo"
  1578. ratelist.50 = "ROL = Romania Leu"
  1579. ratelist.51 = "RUR = Russia Rubles"
  1580. ratelist.52 = "SAR = Saudi Arabia Riyal"
  1581. ratelist.53 = "SDD = Sudan Dinar"
  1582. ratelist.54 = "SEK = Sweden Krona"
  1583. ratelist.55 = "SGD = Singapore Dollars"
  1584. ratelist.56 = "SKK = Slovakia Koruna"
  1585. ratelist.57 = "THB = Thailand Baht"
  1586. ratelist.58 = "TRL = Turkey Lira"
  1587. ratelist.59 = "TTD = Trinidad and Tobago Dollars"
  1588. ratelist.60 = "TWD = Taiwan Dollars"
  1589. ratelist.61 = "USD = United States Dollars"
  1590. ratelist.62 = "VEB = Venezuela Bolivar"
  1591. ratelist.63 = "XAG = Silver Ounces"
  1592. ratelist.64 = "XAU = Gold Ounces"
  1593. ratelist.65 = "XCD = Eastern Caribbean Dollars"
  1594. ratelist.66 = "XDR = Special Drawing Right (IMF)"
  1595. ratelist.67 = "XPD = Palladium Ounces"
  1596. ratelist.68 = "XPT = Platinum Ounces"
  1597. ratelist.69 = "ZAR = South Africa Rand"
  1598. ratelist.70 = "ZMK = Zambia Kwacha"
  1599. Return
  1600.  
  1601. CaseConvert: Procedure
  1602.   Arg cc
  1603.   cc = Translate(cc,XRange("a","z"),XRange("A","Z"))
  1604.   tmp = ""
  1605.   Do a = 1 To Words(cc)
  1606.     Select
  1607.       When Upper(Left(Word(cc,a),2)) = "O'" Then tmp = tmp||"O'"||Upper(SubStr(Word(cc,a),3,1))||SubStr(Word(cc,a),4)||" "
  1608.       When Upper(Left(Word(cc,a),2)) = "MC" Then tmp = tmp||"Mc"||Upper(SubStr(Word(cc,a),3,1))||SubStr(Word(cc,a),4)||" "
  1609.       When Upper(Left(Word(cc,a),3)) = "MAC" Then tmp = tmp||"Mac"||Upper(SubStr(Word(cc,a),4,1))||SubStr(Word(cc,a),5)||" "
  1610.       Otherwise tmp = tmp||Upper(Left(Word(cc,a),1))||SubStr(Word(cc,a),2)||" "
  1611.     End
  1612.   End
  1613.   cc = Strip(tmp)
  1614. Return cc
  1615.